启动SDK后,若要使用云端服务相关操作(获取设备列表、通过云端获取设备物模型属性、添加设备、删除设备等),需进行用户授权。其中用户授权分两种:
- 普通账号登录,即直接通过注册到物联云平台后台管理系统或者是部署私有云后注册使用的用户
- 第三方登录,包括但不限QQ、微信等
不管通过哪种方式进行授权,最终都会获取到一些用户授权信息,建议开发者可以保存此部分信息以备用(根据实际的使用需求有可能不需要使用到,不需要使用时可以不保存)
1. 授权信息说明
调用 XLinkUserAuthorizeTask 或 XLinkThirdPartyAuthorizeTask 后,SDK 内部会维护一个 XLinkUser 对象,里面包含了通讯所需的授权信息:
@interface XLinkUserModel : NSObject
/** 用户ID */
@property(copy, nonatomic) NSNumber *user_id;
/** 调用凭证 */
@property(copy, nonatomic) NSString *access_token;
/** 刷新凭证 */
@property(copy, nonatomic) NSString *refresh_token;
/** 有效期(秒) */
@property(copy, nonatomic) NSNumber *expire_in;
/** 用户认证码 */
@property(copy, nonatomic) NSString *authorize;
@end
此对象可通过如下方法取出:
//通过SDK直接获取
XLinkUserModel *user = [XLinkSDK share].userModel;
1.请不要修改 XLinkUser 对象内的授权信息,APP 运行时,XLinkSDK会自动更新 XLinkUser 内部的授权信息。
2.开发者应避免自己缓存 XLinkUserModel 里的属性(例如把 accessToken 存在一个变量里),应在每次需要的时候直接调用 [XLinkSDK share].userModel取出授权信息。
用户管理对象中提供了快捷获取相关授权信息的方法
XLinkUserModel *user = [XLinkSDK share].userModel;
//获取授权信息
NSString *accessToken = user.access_token;
//获取刷新token
NSString *refreshToken =user.refresh_token;
//获取用户ID
NSNumber *userId =user.user_id;
2. 普通账号授权
对于从平台注册的账号,需要使用普通账号授权任务进行登录操作并获取到授权信息。
XLinkUserAuthorizeTask *userAuthtask = [XLinkUserAuthorizeTask userAuthorizeTaskWithAccount:account
password:password
cropId:cropID
timeout:20
completionHandler:^(id result, NSError *error) {
if (error) {// 登录失败
}else {// 登录成功,在result中含有授权信息,SDK内部自动进行云端连接
}
}];
[userAuthtask start];
3. 第三方账号授权
第三账号授权任务一般是第三方账号接入云平台时的用户账号,该部分账号需要通过第三方账号登录授权任务登录,需要提供第三方账号相关的 openId、accessToken和登陆来源等信息。
XLinkThirdPartyAuthorizeTask *thirdAuthtask = [XLinkThirdPartyAuthorizeTask thirdPartyUserAuthorizeTaskWithSource:userSource
openId:openId
accessToken:accessToken
nickName:nickName
cropId:cropID
timeout:10
completionHandler:^(id result, NSError *error) {
if (error) {// 登录失败
}else {// 登录成功,在result中含有授权信息,SDK内部自动进行云端连接
}
}];
[thirdAuthtask start];
登录源,来源类型有以下几种
登录源 | 类型 |
---|---|
网页 | XLinkUserSourceTypeWeb |
Android | XLinkUserSourceTypeAndroid |
IOS | XLinkUserSourceTypeIOS |
微信 | XLinkUserSourceTypeWechat |
XLinkUserSourceTypeQQ | |
微博 | XLinkUserSourceTypeWeibo |
XLinkUserSourceTypeFacebook | |
XLinkUserSourceTypeTwitter | |
其它遵循xlink统一身份认证规范的用户来源 | XLinkUserSourceTypeOthers |
注意:由于SDK内部需要授权信息,请使用SDK提供的授权接口进行授权,不要自行通过Restful进行用户授权
4. 快捷登录授权
APP 首次打开时(未有用户信息),应跳转至登录页面让用户登陆。登陆动作应包含运行 XLinkUserAuthorizeTask 或 XLinkThirdPartyAuthorizeTask 。
如果要实现用户在下次打开 APP 时跳过登陆动作,那么在首次授权时需要保存授权信息,在下次打开 APP 启动 SDK 前提供授权信息:
//新建XLinkUser对象,设置保存了的授权信息
//access_token、user_id 、refresh_token、authorize四个信息缺一不可
XLinkUserModel *user = [[XLinkUserModel alloc] init];
user.access_token = storgeAccessToken;
user.user_id = storgeUid;
user.refresh_token = storgeRefreshToken;
user.authorize = storgeAuthString;
XLinkConfig *config = [[XLinkConfig alloc] init];
...
// 设置授权信息
config.userModel = user;
...
[[XLinkSDK share] startWithConfig:config];
设置好以后,在 start SDK的同时,SDK会自动验证授权信息是否合法,合法则进行后续一系列的云端操作和内部操作。
另外更简便的操作就是,XLinkUserAuthorizeTask 或 XLinkThirdPartyAuthorizeTask 调用成功之后会通过result返回包含授权信息的Dictionary。您可以直接保存这个Dictionary。在下次启动的时候,使用
XLinkUserModel的快速构建方法 - (instancetype)initWithDict:(NSDictionary *)dict 初始化出*XLinkUserModel,然后便可以和前面的一样初始化并启动SDK。*
5. 重新授权
一般来说,需要重新授权有如下几个原因:
- 用户被踢出(单点登录)
- token过期(含缺失,格式错误等原因)
- 用户主动退出
当出现如上情况时,XLinkUserListener
相关方法会回调:
- (void)onUserLogout:(LogoutReason)reason{
switch (reason) {
case LogoutReasonSingleSignKickOff://用户被踢出
break;
case LogoutReasonTokenExpired:// 过期
break;
case LogoutReasonUserLogout://用户主动退出
break;
case LogoutReasonUserAuthInfoInvaild://用户授权信息不正确
break;
}
}
退出登录原因 | 操作建议 |
---|---|
LogoutReasonSingleSignKickOff | 主动调用[[XLinkSDK share] logout] 退出登录SDK并需要重新登录,建议提示用户账号在其他地方登录,及时检查账号的是否安全 |
LogoutReasonTokenExpired | 主动调用[[XLinkSDK share] logout] 退出登录并需要重新登录,建议提示用户授权信息过期,需要重新登录 |
LogoutReasonUserAuthInfoInvaild | 主动调用[[XLinkSDK share] logout] 退出登录并需要重新登录,建议提示用户授权信息有误,需要重新登录 |
LogoutReasonUserLogout | 勿需特殊操作(因为 LogoutReasonUserLogout 由 [[XLinkSDK share] logout] 话 [[XLinkSDK share] logoutAndStop] 退出登录] 触发) |
请注意,
[[XLinkSDK share] logout]
和[[XLinkSDK share] logoutAndStop]
操作会触发LogoutReasonUserLogout
事件,处理时请注意避免由于在LogoutReasonUserLogout
事件中重复调用该方法引起造成循环逻辑